home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-02
/
printdir.zip
/
PWD.PAS
< prev
Wrap
Pascal/Delphi Source File
|
1993-01-04
|
4KB
|
88 lines
PROGRAM PWD; {Print Working Directories on all valid drives.
(C) Copyright 1989, Earl F. Glynn, Overland Park, KS. Compuserve: 73257,3527
All Rights Reserved. Version 1.0, 14 June 1989. This program may be
freely distributed for non-commerical use.
Information about the Disk Parameter Block and what I have termed the
"Drive Array" was found in the public domain program SYSID.PAS by
Steve Grant, Long Beach, CA. I prefer to use RECORDs and pointers to
access this information instead of the MEM and MEMW Turbo Pascal "arrays".}
USES DOS; {INTR}
TYPE
DiskParameterBlockPointer = ^DiskParameterBlock;
DiskParameterBlock =
RECORD { offset }
misc1 : BYTE; { 0 $00 }
driveunit : BYTE; { 1 $01 }
BytesPerSector : WORD; { 2 $02 }
SectorsPerCluster : BYTE; { 4 $04 }
ClusterToSectorShift: BYTE; { 5 $05 }
ReservedSectors : WORD; { 6 $06 }
FATs : BYTE; { 8 $08 }
RootDirectoryEntries: WORD; { 9 $09 }
FirstDataSector : WORD; { 11 $0B }
Clusters : WORD; { 13 $0D }
SectorsPerFAT : BYTE; { 15 $0F }
RootDirectorySector : WORD; { 16 $10 }
DeviceHeader : pointer; { 18 $12 }
MediaType : BYTE; { 22 $16 }
Valid : BYTE; { 23 $17 }
NextDPB : pointer { 24 $18 }
END;
DriveArrayPointer = ^DriveArray;
DriveArray =
RECORD
DefaultDirectory: ARRAY[1..69] OF CHAR; {ASCIIZ string}
DPB : DiskParameterBlockPointer;
END;
DOSListOfLists =
RECORD { offset }
FirstMCBSegment : WORD; { -2 -$02 }
misc1 : ARRAY[1..16] OF BYTE; { 0 $00 }
MaxBytesPerBlock: WORD; { 16 $10 }
misc2 : ARRAY[1..4] OF BYTE; { 18 $12 }
BaseDA : DriveArrayPointer; { 22 $16 }
misc3 : ARRAY[1..7] OF BYTE; { 26 $1A }
LastDrive : BYTE { 33 $21 }
END;
VAR
c : CHAR;
DA : DriveArrayPointer;
DPB : DiskParameterBlockPointer;
drive: WORD;
i : WORD;
LoL : ^DOSListOfLists;
r : Registers;
BEGIN
WRITELN ('Working Directories:');
r.AH := $52;
Intr ($21,r); {Undocumented DOS function}
LoL := Ptr(r.ES,r.BX-2); {DOS List of Lists - 2}
DA := LoL^.BaseDA; {First Drive Array entry}
drive := 1;
REPEAT
DPB := DA^.DPB; {Disk Parameter Block}
IF DPB^.valid = 0 {Is this drive valid?}
THEN BEGIN
WRITE (' ');
i := 1;
c := DA^.DefaultDirectory[i]; {Output working directory}
WHILE c > #$00 DO BEGIN {Look for end of ASCIIZ string}
WRITE (c);
INC (i);
c := DA^.DefaultDirectory[i]
END;
WRITELN
END;
INC (drive);
DA := Ptr(Seg(DA^), Ofs(DA^)+$51) {Next Drive Array entry}
UNTIL (Seg(DPB^.NextDPB^) = $FFFF) OR (drive > LoL^.LastDrive)
END {PWD}.